package org.example.lethear.config;

import lombok.RequiredArgsConstructor;
import org.example.lethear.entity.Category;
import org.example.lethear.entity.Role;
import org.example.lethear.entity.User;
import org.example.lethear.entity.UserProfile;
import org.example.lethear.repository.CategoryRepository;
import org.example.lethear.repository.RoleRepository;
import org.example.lethear.repository.UserRepository;
import org.example.lethear.repository.UserProfileRepository;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 * 数据初始化组件
 * 在应用启动时创建默认数据
 */
@Component
@RequiredArgsConstructor
public class DataInitializer implements CommandLineRunner {
    
    private final RoleRepository roleRepository;
    private final CategoryRepository categoryRepository;
    private final UserRepository userRepository;
    private final UserProfileRepository userProfileRepository;
    private final PasswordEncoder passwordEncoder;
    
    @Override
    public void run(String... args) {
        initializeRoles();
        initializeCategories();
        initializeAdminUser();
    }
    
    /**
     * 初始化用户角色
     */
    private void initializeRoles() {
        // 创建用户角色
        if (!roleRepository.existsByRoleName("USER")) {
            Role userRole = new Role("USER", "普通用户", "[\"POST_CREATE\", \"COMMENT_CREATE\", \"WHISPER_CREATE\", \"PROFILE_EDIT\"]");
            roleRepository.save(userRole);
            System.out.println("创建默认用户角色: USER");
        }
        
        // 创建管理员角色
        if (!roleRepository.existsByRoleName("ADMIN")) {
            Role adminRole = new Role("ADMIN", "管理员", "[\"USER_MANAGE\", \"POST_MANAGE\", \"COMMENT_MANAGE\", \"WHISPER_MANAGE\", \"REPORT_MANAGE\"]");
            roleRepository.save(adminRole);
            System.out.println("创建默认管理员角色: ADMIN");
        }
        
        // 创建系统管理员角色
        if (!roleRepository.existsByRoleName("SYSTEM_ADMIN")) {
            Role systemAdminRole = new Role("SYSTEM_ADMIN", "系统管理员", "[\"USER_MANAGE\", \"POST_MANAGE\", \"COMMENT_MANAGE\", \"WHISPER_MANAGE\", \"SYSTEM_MANAGE\", \"REPORT_MANAGE\", \"ADMIN_MANAGE\"]");
            roleRepository.save(systemAdminRole);
            System.out.println("创建系统管理员角色: SYSTEM_ADMIN");
        }
    }
    
    /**
     * 初始化分类
     */
    private void initializeCategories() {
        // 创建默认分类
        if (categoryRepository.count() == 0) {
            createCategory("技术交流", "分享技术心得，讨论技术问题");
            createCategory("生活随笔", "记录生活点滴，分享生活感悟");
            createCategory("学习笔记", "记录学习过程，分享知识总结");
            createCategory("项目展示", "展示个人项目，分享开发经验");
            createCategory("问题求助", "遇到问题求助，互相帮助解答");
            createCategory("其他", "其他类型的内容分享");
            
            System.out.println("创建默认分类完成");
        }
    }
    
    /**
     * 初始化管理员用户
     */
    @Transactional
    private void initializeAdminUser() {
        // 检查是否已经存在管理员用户
        if (userRepository.findByUsername("admin").isPresent()) {
            System.out.println("管理员用户已存在: admin");
            return;
        }
        
        // 创建新的管理员用户
        User adminUser = new User();
        adminUser.setUsername("admin");
        adminUser.setEmail("admin@lethear.com");
        adminUser.setPassword(passwordEncoder.encode("admin123456"));
        adminUser.setStatus(1);
        adminUser.setEmailVerified(true);
        
        // 保存用户
        User savedUser = userRepository.save(adminUser);
        System.out.println("创建管理员用户: admin / admin123456");
        
        // 为管理员分配系统管理员角色
        Role systemAdminRole = roleRepository.findByRoleName("SYSTEM_ADMIN")
                .orElseThrow(() -> new RuntimeException("系统管理员角色不存在"));
        savedUser.getRoles().add(systemAdminRole);
        savedUser = userRepository.save(savedUser);
        System.out.println("为管理员分配系统管理员角色");
        
        // 创建用户资料
        UserProfile profile = new UserProfile();
        profile.setUserId(savedUser.getId());
        profile.setNickname("系统管理员");
        profile.setBio("LetHear系统管理员");
        userProfileRepository.save(profile);
        System.out.println("创建管理员用户资料");
        
        System.out.println("管理员用户初始化完成");
    }
    
    /**
     * 创建分类
     */
    private void createCategory(String name, String description) {
        Category category = new Category(name, description);
        categoryRepository.save(category);
        System.out.println("创建分类: " + name);
    }
} 